package com.ruoyi.common.utils.processor;

import java.lang.reflect.Field;

/**
 * 字节数组处理工具类
 */
public class ByteArrayProcessor {

    /**
     * 处理对象中所有byte[]类型的字段，去除末尾空格
     * @param obj 需要处理的对象
     */
    public static void trimByteArrayFields(Object obj) {
        if (obj == null) {
            return;
        }

        trimByteArrayFieldsRecursive(obj, obj.getClass());
    }

    /**
     * 递归处理对象及其父类中的byte[]字段
     * @param obj 对象实例
     * @param clazz 对象的类
     */
    private static void trimByteArrayFieldsRecursive(Object obj, Class<?> clazz) {
        if (clazz == null || clazz == Object.class) {
            return;
        }

        // 处理当前类的字段
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            try {
                // 只处理 byte[] 类型的字段
                if (field.getType() == byte[].class) {
                    field.setAccessible(true);

                    // 获取字段值
                    Object value = field.get(obj);

                    // 如果字段值不为null且是byte数组，则进行处理
                    if (value instanceof byte[]) {
                        byte[] byteArray = (byte[]) value;
                        byte[] trimmedArray = trimByteArray(byteArray);

                        // 如果数组发生了变化，则设置回对象
                        if (trimmedArray != byteArray) {
                            field.set(obj, trimmedArray);
                        }
                    }
                }
            } catch (Exception e) {
                // 记录异常但不中断处理流程
                // 可以根据需要添加日志记录
            }
        }

        // 递归处理父类
        trimByteArrayFieldsRecursive(obj, clazz.getSuperclass());
    }

    /**
     * 去除byte数组末尾的空格(0x20)
     * @param original 原始byte数组
     * @return 去除末尾空格后的新数组，如果没有变化则返回原数组
     */
    private static byte[] trimByteArray(byte[] original) {
        if (original == null || original.length == 0) {
            return original;
        }

        // 找到末尾非空格字符的位置
        int endIndex = original.length - 1;
        while (endIndex >= 0 && original[endIndex] == 0x20) {
            endIndex--;
        }

        // 如果所有字符都是空格
        if (endIndex < 0) {
            return new byte[0]; // 返回空数组
        }

        // 如果没有变化（末尾没有空格）
        if (endIndex == original.length - 1) {
            return original;
        }

        // 创建新的数组，去除末尾空格
        byte[] trimmed = new byte[endIndex + 1];
        System.arraycopy(original, 0, trimmed, 0, endIndex + 1);
        return trimmed;
    }
}
